//
//  BEMirrorExtension.swift
//  BasicExtensions
//
//  Created by 范晓鑫 on 2022/12/6.
//

import Foundation

extension Mirror {
    /// 特定类型的属性
    public typealias TypedChild<T> = (label: String?, value: T)
    /// 特定类型的属性集合
    public typealias TypedChildren<T> = [TypedChild<T>]
    
    /// 获取指定类型的属性
    public func children<T>(for type: T.Type) -> TypedChildren<T> {
        return self.children.compactMap { (label, value) in
            if let value = value as? T {
                return (label, value)
            } else {
                return nil
            }
        }
    }
    /// 获取使用指定属性包装器的属性，跟children一样，但返回的label会自动把前面的_去掉
    public func propertyWrappers<T>(for type: T.Type) -> TypedChildren<T> {
        return self.children(for: type).map { (label, value) in
            return (label?.dropFirst().asString, value)
        }
    }
}
